#ifndef _LISTACOMPARTIDA_H_
#define _LISTACOMPARTIDA_H_

#include "Shm.h"
#include "Semaforo.h"

#include <vector>

template <class T> class ListaCompartida{
    Shm compartida;
    Semaforo semaforo;
    public:
    ListaCompartida(int idLista):compartida(idLista),semaforo(idLista){}

    std::vector<T> obtenerLista(){
	Lock l(semaforo);
	T* listaCompartida = (T *)compartida.getBase();
	int i=0;
	std::vector<T> lista;
	while(listaCompartida[i] != 0){
	    lista.push_back(listaCompartida[i]);
	    i++;
	}
	return lista;
    }

    int size(){
	return obtenerLista().size();
    }

    void eliminarElemento(T elemento){
	Lock l(semaforo);
	T* listaCompartida = (T*)compartida.getBase();
	int ultimo=0;

	while(listaCompartida[ultimo+1] != 0)
	    ultimo++;

	int buscado = 0;
	while(listaCompartida[buscado] != elemento && buscado < ultimo)
	    buscado++;

	if(buscado <= ultimo){
	    listaCompartida[buscado] = listaCompartida[ultimo];
	    listaCompartida[ultimo] = 0;
	}
    }


    bool agregarElemento(T elemento){
	Lock l(semaforo);
	long* listaCompartida = (long *)compartida.getBase();
	int i=0;
	while(listaCompartida[i] != 0){
	    if(listaCompartida[i] == elemento)
		return true;
	    i++;
	}
	
	listaCompartida[i] = elemento;
	listaCompartida[i+1] = 0;
	return true;
    }


    ~ListaCompartida(){}
};

#endif /* _LISTACOMPARTIDA_H_ */
